﻿/**
 * author：唐小妮
 * Date：  2015/10/24
 */
(function ($) {

    /**
     * 计算当月天数
     * @param m 选中的月
     * @param y 选中的年
     */
    var calculateDate = function (m, y) {
        var count = 0;
        switch (m) {
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                count = 31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                count = 30;
                break;
            case 2:
                if (y % 4 == 0)
                    count = 29;
                else
                    count = 28;
                if ((y % 100 == 0) & (y % 400 != 0))
                    count = 28;
        }
        return count;

    }


    /**
     * 屏蔽每个月不可点击的日期
     * @param item  天（日）的选择器
     * @param n     当月天数
     * @param callback
     */
    var disableDate = function (item, n, callback) {
        item.removeClass("disabled");
        for (var i = 0; i < 31 - n; i++) {
            item.eq(n + i).addClass("disabled");

        }
        callback && callback();
    }
    /**
     * 如果n为个位数，则将其格式化为0n；
     * @param n
     * @returns {*}
     */
    var formatNum = function (n) {
        return n.toString().length == 2 ? n : "0" + n;
    }

    /*设置文本框的值  年、月、日*/
    var setDateValue = function (bool, input, y, m, d) {
        var date_str = bool ? y + "/" + formatNum(m) + "/" + formatNum(d) : y + "/" + formatNum(m);
        input.val(date_str);
    }

    /*设置日期弹窗的选中样式 年/月/日 */
    var setDateSelect = function (date, targetModel) {
        var y = date.substr(0, 4),
            m = parseInt(date.substr(5, 2)),
            d = parseInt(date.substr(8, 2));
        targetModel.find(".cur").removeClass("cur")

        targetModel.find(".year").find("li[data-value='" + y + "']").addClass("cur")
        targetModel.find(".mon").find("li[data-value='" + m + "']").addClass("cur")
        targetModel.find(".date") && targetModel.find(".date").find("li[data-value='" + d + "']").addClass("cur")

    }
    $.fn.datePicker = function (o) {

        var init = {
            currentTime: new Date(),
            container: "body"

        };
        var o = $.extend(init, o);

        $(this).each(function () {

            var now = o.currentTime,
                y = now.getFullYear(),
                m = now.getMonth(),
                d = now.getDate(),
                yearMin = y;  //用于监听显示的当前最小的年
            var target_input = $(this),
                target_id = target_input.attr("id"),
                hasDate=typeof target_input.siblings(".J_date").html() == "undefined"?false:true,
                dateShow = target_input.data("type") == "date" ? true : false;//是否显示日


            var J_date = hasDate?target_input.siblings(".J_date"):"";
            var list_y,list_m,list_d,list_d_item;
            if(hasDate){
                list_y =J_date.find('.year'),
                list_m =J_date.find('.mon'),
                list_d =J_date.find('.date');

                list_d_item = typeof list_d.html()!="undefined" ? list_d.find("li") : "";
            }

            /*创建及初始化日期容器*/
            var createModel = function () {
                target_input.after('<div  class="u-chose J_date"></div>');


                var J_date = target_input.siblings(".J_date");


                J_date.css("top", target_input.offsetHeight)

                /*创建年月显示容器*/
                J_date.append("<ul class='year' data-value=''></ul><ul class='mon' data-value=''></ul>");

                /*创建日显示容器*/
                dateShow && J_date.append("<ul class='date' data-value=''></ul>");

                    list_y = J_date.find('.year'),
                    list_m = J_date.find('.mon'),
                    list_d = J_date.find('.date') ? J_date.find('.date') : "";

                //首先遍历输出年份，方便动态监听滚动条
                for (var i = 0; i < 20; i++) {
                    var n = y - i;
                    yearMin--;
                    list_y.append('<li data-value=' + n + '>' + n + '</li>');
                }

                for (var i = 1; i <= 12; i++) {
                    list_m.append('<li data-value=' + i + '>' + i + '月</li>');
                }
                for (var i = 1; i <= 31; i++) {
                    if (!dateShow) break;
                    list_d.append('<li data-value=' + i + '>' + i + '</li>');
                }

                var list_y_item = list_y.find("li"),
                    list_m_item = list_m.find("li");
                    list_d_item = list_d.find("li") ? list_d.find("li") : "";

                //初始化默认选中当前日期，分别给年，月，日的date-value属性赋值，用于存储选中日期
                setDateValue(dateShow, target_input, y, m + 1, d);
                list_y.data("value", y);
                list_m.data("value", m + 1); //之所以m加1，因为getMonth()输出为0~11
                list_d.data("value", d);
                list_y_item.eq(0).addClass("cur");
                list_m_item.eq(m).addClass("cur");
                dateShow && list_d_item.eq(d - 1).addClass("cur");
            }

            /*文本框绑定的日期不存在则创建*/
            if (!hasDate) {
                createModel()
            }

            var showLock;//下拉效果锁

            var dateMode = target_input.parent(),
                section = dateMode.find(".u-chose");


            dateMode.addClass("active");
            section.stop().slideDown(100);

            section.mouseenter(function () {
                showLock = 0;
                section.find("li").on("click", function () {
                    var _this = $(this);

                    if (_this.hasClass("cur") || _this.hasClass("disabled"))  return; //如果点击的地方已经被选中，则不进行下面的操作

                    var chose_y = list_y.data("value"),
                        chose_m = list_m.data("value"),
                        val = _this.data("value");

                    _this.siblings().removeClass("cur");
                    _this.addClass("cur");

                    /*选择年*/
                    _this.parent().hasClass("year") && disableDate(list_d_item, calculateDate(chose_m, val),
                        function () {
                            /*某日被禁用掉时已被选中，则移除选中样式，设置日默认为01日*/
                            if (list_d.find(".disabled").hasClass("cur")) {
                                list_d_item.removeClass("cur");
                                list_d.data("value", "01");
                                list_d_item.eq(0).addClass("cur")
                            }
                            list_y.data("value", val);
                        })

                    /*选择月*/
                    _this.parent().hasClass("mon") && disableDate(list_d_item, calculateDate(val, chose_y),
                        function () {
                            /*某日被禁用掉时已被选中，则移除选中样式，设置日默认为01日*/
                            if (list_d.find(".disabled").hasClass("cur")) {
                                list_d_item.removeClass("cur");
                                list_d.data("value", "01");
                                list_d_item.eq(0).addClass("cur")
                            }
                            list_m.data("value", val);
                        })

                    /*选择日*/
                    _this.parent().hasClass("date") && list_d.data("value", val);

                    /*设置文本框的值*/
                    setDateValue(dateShow, target_input, list_y.data("value"), list_m.data("value"), list_d.data("value") ? list_d.data("value") : "");

                });

                /*拖动显示年的容器滚动条，到达底部时再加载后二十条*/
                var timer;

                $(list_y).on("scroll", function () {
                    var current = new Date(),
                        currentYear = current.getFullYear();


                    var _this = $(this);


                    if (_this.get(0).scrollHeight >= _this.get(0).offsetHeight - 180) {


                        clearTimeout(timer);
                        timer = setTimeout(function () {

                            for (var i = 0; i < 20; i++) {
                                if (yearMin <= currentYear - 70) {
                                    break;
                                }
                                yearMin--;
                                _this.append('<li data-value=' + yearMin + '>' + yearMin + '</li>')

                            }

                        }, 1000)


                    }
                })
            }).mouseleave(function () {
                showLock = 1;
                section.stop().slideUp(300, function () {
                    dateMode.removeClass("active");

                });

            })

            $(o.container).on("blur", "#" + target_id, function () {
                var value = $(this).val();

                setDateSelect(value, $(this).siblings(".J_date"))

                if (showLock != 0) {
                    var dateMode = $(this).parent();
                    dateMode.find(".u-chose").stop().slideUp(300, function () {
                        dateMode.removeClass("active")
                    });

                }

            })


        });
        return this;
    }
})(jQuery)